/*
 * @lc app=leetcode.cn id=2 lang=javascript
 *
 * [2] 两数相加
 *
 * https://leetcode-cn.com/problems/add-two-numbers/description/
 *
 * algorithms
 * Medium (32.43%)
 * Total Accepted:    83.6K
 * Total Submissions: 257.6K
 * Testcase Example:  '[2,4,3]\n[5,6,4]'
 *
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 *
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 *
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * 示例：
 *
 * 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出：7 -> 0 -> 8
 * 原因：342 + 465 = 807
 *
 *
 */
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function(l1, l2) {
  const array1 = listToArray(l1)
  const array2 = listToArray(l2)
  const longerArray = array1.length > array2.length ? array1 : array2
  const otherArray = longerArray === array1 ? array2 : array1
  const newArray = []
  let plusFlag = 0
  longerArray.forEach((num, idx) => {
    console.log('before plusFlag', plusFlag)
    const sum = num + (otherArray[idx] || 0) + plusFlag
    plusFlag = sum >= 10 ? 1 : 0
    console.log('plusFlag', plusFlag)
    newArray.push(sum % 10)
    if (idx === longerArray.length - 1 && plusFlag) {
      newArray.push(1)
    }
  })
  return numToList(newArray)
}

function ListNode(val) {
  this.val = val
  this.next = null
}

function listToArray(li) {
  const r = [li.val]
  while (li.next) {
    r.push(li.next.val)
    li = li.next
  }
  return r
}

function numToList(num) {
  let splited = num
  if (!Array.isArray(num)) {
    splited = num
      .toString()
      .split('')
      .reverse()
  }
  const originNode = new ListNode(splited.shift(0))
  splited.reduce((node, n) => {
    node.next = new ListNode(n)
    return node.next
  }, originNode)
  return originNode
}

// console.log(addTwoNumbers(numToList([2, 4, 3]), numToList([5, 6, 4])))
// console.log(numToList([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]))
